home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1997 July: Mac OS SDK / Dev.CD Jul 97 SDK2.toast / Development Kits (Disc 2) / ScriptX / Code Samples / untested / tcpip / ifish / mqueue.sx < prev    next >
Encoding:
Text File  |  1996-05-21  |  1.8 KB  |  84 lines  |  [TEXT/ttxt]

  1. --<<
  2.  
  3. in module InternetFish
  4.  
  5. class MessageQueue ()
  6. instance variables
  7.     myQueue
  8.     myStream
  9.     myFunction
  10.     myWriter
  11.     myReader
  12.     myClient
  13. end
  14.  
  15.  
  16. method init self {object MessageQueue} #rest args #key stream: fun: client: -> (
  17.     self.myQueue := new PipeClass
  18.     self.myStream := stream
  19.     self.myFunction := fun
  20.     self.myClient := client
  21.     self.myWriter := ((doWriting self) &)
  22.     self.myReader := ((doReading self) &)
  23. )
  24.  
  25. method write self {object MessageQueue} obj -> (
  26.     write self.myQueue obj
  27. )
  28.  
  29. method writePacket self {object MessageQueue} o -> (
  30.     local n := size o
  31.     if (n < 256 and n > 0) then (
  32.         write self.myStream n
  33.     ) else (
  34.         write self.myStream 0
  35.         write self.myStream (mod n 256)
  36.         write self.myStream ((n / 256) as integer)
  37.     )
  38.     for i in o do write self.myStream i
  39. )
  40.  
  41. method doWriting self {object MessageQueue} -> (
  42.     guard (
  43.         repeat while true do (
  44.             writePacket self (read self.myQueue)
  45.             repeat while self.myQueue.size > 0 do 
  46.                 writePacket self (read self.myQueue)
  47.             flush self.myStream
  48.         )
  49.     )
  50.     catching
  51.     cantWrite : ( caught (self.myFunction self.myCLient #(@writeFailed, self.myStream))
  52.                 )
  53.     TCPException: ( caught (self.myFunction self.myCLient #(@writeFailed, self.myStream)))
  54.     end
  55. )
  56.  
  57. method doReading self {object MessageQueue} -> (
  58.     guard (
  59.         repeat while true do (
  60.             local n := (read self.myStream)
  61.             if (n == 0) do (
  62.                 n := (read self.myStream)
  63.                 n := n + 256 * (read self.myStream)
  64.             )
  65.             local s := new array
  66.             for i in 1 to n do append s (read self.myStream)
  67.             self.myFunction self.myCLient s
  68.         )
  69.     )
  70.     catching
  71.     cantRead : ( caught (self.myFunction self.myCLient #(@readFailed, self.myStream))
  72.                 )
  73.     TCPException: ( caught (self.myFunction self.myCLient #(@readFailed, self.myStream))
  74.             )
  75.     end
  76. )
  77.  
  78. method plug self {object MessageQueue} -> (
  79.     -- What can we do here?
  80. )
  81.  
  82. -->>
  83.  
  84.